//
//  network.hpp
//  DataStructure
//
//  Created by 劢克科技 on 2020/8/26.
//  Copyright © 2020 Shuleiming. All rights reserved.
//

#ifndef network_hpp
#define network_hpp

#include <stdio.h>

// ***** 计算机网络 *****
// 概念
// 计算机网络、有线电视网络、电信网络：三网融合
// 将分散的计算机通过线路和通信设备连接起来，由软件实现信息传递
// 互连：相互连通
// 自治：无主从关系

// *** 功能 ***
// **数据通信
// **资源共享：硬件、软件、数据
// 分布式处理
// 提高可靠性
// 负载均衡...

// 网络：计算机连接在一起
// 互联网：把网络连接在一起，因特网是世界上最大的互联网

// ISP：互联网服务商（中国电信）

// ***** 计算机网络的组成 *****
// 组成：硬件+软件+协议
// 工作方式：边缘部分+核心部分
// *** 组成：通信子网+资源子网

// 边缘部分：C/S方式 Client/Server、B/S方式；P2P方式 （即是服务器，又是客户端）
// 核心部分：路由器、网络为边缘部分服务

// *** 通信子网：实现数据通信（传输数据）（下3层）
// *** 资源子网：实现资源共享/数据处理（对数据封装和处理）（上3层）

// 计算机网络的分类...
// 1. 安装范围分类
// 2. 安装使用者分类
// 3. 安装交换技术分类
// 4. 按拓扑结构分类
// 5. 安装传输技术分类

// ***** 标准化工作 *****
// 法定标准：OSI
// 事实标准：TCP、IP

// RFC（Request For Comments）：因特网的标准形式
// 相关组织：ISO、IEEE

// ***** 性能指标 *****
// *** 速率：数据传输的快慢，数据率或者比特率b/s,kb/s
// 比特：数据传输的单位：位（1/0）
// 1b/s = 1秒传输10个数字
// 1B = 8b
// 1kb/s = 10^3b/s
// 1kB=2^10B

// *** 带宽：发送端最高数据率(b/s)(理想的)
// 是网络设备所能支持最高速度

// *** 吞吐量（实际的）
// 单位时间通过某个网络的数据量（所有相加）：b/s,kb/s...

// 时延
// 数据从网络的一端传送到另一端所需的时间，也称作延迟(s)
// 发送时延：数据长度 / 带宽（发送速率）
// 传播时延：信道长度 / 电磁波传播速度
// 排队时延：等待输出/入链路可用（路由器）（安检...）
// 处理时延：检错找出口（路由器）（安检...）

// 时延带宽积（链路中此刻有多少比特）（容量）
// 时延带宽积 = 传播时延 * 带宽 （bit）

// 往返时延RTT
// RTT越大，可发送的数据越多;不包括发送时延
// RTT = 传播时延*2+末端处理时间

// 利用率
// 信道利用率：有数据通过的时间 / 总时间
// 网络利用率：信道利用率加权平均值
// 利用率越高，时延越大

// ***** 分层结构、协议、服务 *****

// 为什么分层：把大问题分为小问题。
// 计算机网络体系结构：计算机网络的各层及其协议组成（*** 5层协议）

// 实体：每一层中的活动元素
// 协议：对等实体间才有协议，协议是水平的；语法、语义、同步
// 接口：每两层间的关节，上层使用下层服务的入口
// 服务：下级为上级提供服务，服务是垂直的

// 分层原则
// 1.各层功能相互独立
// 2.每层间的交流尽可能少
// 3.每层采用合适的技术
// 4.下级为上级服务
// 5.整个结构能促进标准化工作

// ***** OSI参考模型 *****
// OSI：7层参考模型
// TCP/IP：4层参考模型

// 7.应用层：所有能和用户交互并产生网络流量的进程；文件传输（FTP），电子邮件（SMTP），万维网（HTTP）
// 6.表示层：定义语法和语义；1.数据格式转化 2.数据加密和解密 3.数据压缩和恢复
// 5.会话层：提供建立连接并有效地传输数据，建立同步（SYN）
// 4.传输层：端到端通信，传输单位是报文段（TCP、UDP）
// 功能：可差流用
//  1.可靠传输、不可靠传输：确认收到、不确认收到
//  2.差错控制
//  3.流量控制：匹配收发速度
//  4.复用分用
// ***3.网络层：IP层；数据分组以及转发；传输单位是数据报（数据报切割为分组）
//  1.路由选择：最佳选择
//  2.流量控制
//  3.差错控制
//  4.拥塞控制：整体缓解
// 2.数据链路层（2层PDU在头尾加2个数据）：把数据报组装成帧
//  1.成帧：001110010
//  2.流量控制
//  3.差错控制：帧错+位错
//  4.访问控制：控制共享信道
// 1.物理层：透明传输，传输单位：比特
// 记：物联网淑慧试用...；打包/拆包的过程
// 通信子网：实现数据通信（传输数据）（下3层）
// 资源子网：实现资源共享/数据处理（对数据封装和处理）（上3层）

// 上4层：端到端通信
// 下3层：点到点的传播

// ***** TCP/IP参考模型 *****
//       OSI参考模型   ；TCP/IP模型
// 网络层：无连接+面向连接；无连接
// 传输层：面向连接      ；无连接+面向连接

// 5层参考模型（融合了2个模型的优点）
// 应用层：FTP、SMTP、HTTP（报文）
// 传输层：TCP、UDP（报文段）
// 网络层：IP、ICMP、OSPF（数据报）
// 数据链路层：PPP（帧）
// 物理层（比特）


// ***** 物理层 *****
// 功能：解决如何传输数据比特流，而不是具体的传输媒介；*** 定义接口标准

// 判断各种特性
// 1. 机械特性：接口形状，引脚数量...
// 2. 电气特性(有数字)：电压范围、阻抗值...
// 3. 功能特性(无数字)：意义、含义...
// 4. 规程特性：规程、时序...

// ***** 数据通信 *****
// 通信图...

// 通信目的：传送消息（消息：语音、文字、图像、视频）
// 数据data：有意义的符号序列
// 信号：数据的存在形式（数字信号（离散），模拟信号（连续））
// 信源
// 信宿
// 信道：有方向的传输介质
// 数字信道、模拟信道；有线信道、无线信道

// 通信方式
// 单工：1条信道
// 半双工：2条信道
// 双工：2条信道

// 传输方式
// 串行传输：逐个比特传输；速度慢，费用低，距离远
// 并行传输：8位通过8条信道传输；速度快，费用高，距离近；适用于计算机内部

// 实现同步
// 同步传输：先发送同步字符，等待对方确认，*** 两头先确认再整块发送
// 异步传输：添加起始字符位和终止字符位，*** 随时发送数据

// 码元
// 数字脉冲的一段
// 码元的离散状态有m个时，称为m进制码元
// 2进制码元携带1个比特；4进制码元携带2个比特；16进制码元携带4个比特；

// 码元传输速率（单位Baud）
// *** 单位时间传输的码元个数（数字信号的变化次数），1B = 1秒传输1个码元
// 2秒传输4800码元，则码元速率为2400B
// 码元传输速率与码元的长度有关

// 信息传输速率b/s
// 1秒传输多少比特
// 1个码元携带n个比特的信息量，MBaud的信息传输率为：n*M bit/s

/**
 某一数字通信系统传输的是四进制码元,4s传输了8000个码元,求系统的码元传输速率是多 少?信息传输速率是多少?若另一通信系统传输的是十六进制码元,6s传输了7200个码元,求 他的码元传输速率是多少?信息传输速率是多少?并指出哪个系统传输速率快?
 码元传输速率：2000B
 信息传输速率：2000 * 2 = 4000b/s
 码元传输速率：1200B
 传输速率：1200*4 = 4800b/s
 第二种系统传输速率快
  
 已知八进制数字信号的传输速率为1600B。试问变换成二进制数字信号时的传输速率是多
 少?
 (Tips:速率为1600B表示1600波特/秒
 速率为1600B/s表示1600字节/秒)
 信息传输速率为：1600*3 = 4800b/s
 
 已知二进制数字信号的传输速率为2400b/s。试问变换成四进制数字信号时，传输速率为多少波特?
 二进制码元传输速率：2400B ---> 2400b/s
 四进制码元传输速率：1200B ---> 2400b/s
 */

// 带宽
// 模拟型号中：最高频和最低频的差值（Hz）
// 数字设备中：每秒通过的数据(b/s)

// ***** 奈氏准则、香农定理 *****
// 失真
// 信号受到干扰导致波形变化，变化严重时无法识别信号

// 因素
// 1. 码元传输速率
// 2. 距离
// 3. 噪声干扰
// 4. 传输媒体质量

// 信道带宽：最高频率-最低频率
// 码间串扰：频率太高，导致失去码元间的清晰界限

// *** 奈氏准则（码元速率上限）
// 理想低通条件下
// 极限码元传输速率：*** 2WBaud，W指的是信道带宽(Hz)
// 信道频带越宽，码元传输速率的极限越大
// 奈氏准则只限制码元的传输速率，不限制信息传输速率

/**
 在无噪声的情况下，若某通信链路的 带宽为3kHz，采用4个相位，每个相位具 有4种振幅的QAM调制技术，则该通信链 路的最大数据传输率是多少?
 根据奈氏准则，码元的最大传输速率为：6000B
 每个码元有16种变化，携带了4比特数据
 数据的最大传输速率为：6000 * 4 = 24kb/s
 */

// *** 香农定理（信息传输速率上限）
// 在有噪声的条件下
// 信噪比 = 信号功率 / 噪音功率 S/N (SIGNAL-NOISE RATIO)
// *** 信噪比(dB) = 10log(S/N)
// *** 信道的极限数据传输速率=Wlog2(1+S/N) (b/s)

// 奈氏准则和香农定理中的带宽（Hz）
// 带宽越大极限传输速率越大

/**
 电话系统的典型参数是信道带宽为 3000Hz，信噪比为30dB，则该系统最大 数据传输速率是多少?
 10lg(x) = 30dB ---> x = 1000 S/N
 数据最大传输速率为：3000 * log2(1000+1) ≈ 30kb/s
 */

// “Nice”和”香农“
// 奈氏定理（内忧）码元极限：2WBaud，数据极限：2wlog2V
// 香农定理（外患）数据极限：Wlog2(S/N + 1)
// 如何选择？如果没有信噪比，则用香农定理；否则两个都要算，取最小的数据率

/**
 二进制信号在信噪比为127 : 1的4kHz信道上传输，最大的数据速率可达到多少?
 根据奈氏准则，最大传输速率为：8kb/s
 根据香农定理，最大传输速率为：28kb/s
 所以最大传输速率为：8kb/s
 */

// ***** 编码和调制 *****
// 信道：有方向的传输媒介
// 信道分类：数字信道，模拟信道；无线信道，有线信道

// 基带信号：0和1用不同的电压表示（数字信号），放到数字信道上传输（基带传输（近距离））
// 宽带信号：模拟信号，放到模拟信道上（宽带传输（远距离））

//                      数字数据、模拟数据
// 编码：数据 -> 数字信号（数字发送器、PCM编码器）
// 调制：数据 -> 模拟信号（调制器、放大器）

// 编码方式（编码）
// 数字数据 -> 数字信号（基带传输）
// 非归零编码：编码容易，无法判断开始结束，难以同步
// 归零编码：一个码元内需要归零（信道利用率低，一个码元内可能有跳变）
// 反向不归零编码：同1异0（一个码元无跳变）

// 曼彻斯特编码：前高后低表示1，前低后高表示0（也可以相反）
// 每个码元内都有跳变（用于同步）
// 每个码元被分为2个电平，数据传输速率只有调制的1/2

// 差分曼彻斯特编码：同1异0
// 常用在局域网传输，抗干扰性强于曼彻斯特编码
// 每个码元间有跳变（同步）

// 4B/5B编码
// 5个比特编码4个编码，效率80%
// 数据+控制码

// 数字数据调制为模拟信号（调制）
// ASK：调幅，0没振幅，1有振幅
// FSK：调频，0低频，1高频
// PSK：调相，0正弦波，1余弦波
// QAM：调幅+调相

// 模拟数据编码为数字信号
// 对音乐的编码：PCM编码
// 1.抽样(离散的点)：采样频率>=2*信号最高频率
// 2.量化(离散的整数)
// 3.编码(二进制)

// 模拟数据调制为模拟信号
// 提升频率，利用频分服用技术。

// ***** 数据交换方式 *****

// 这是为了节省链路成本
// 数据交换：计算机要实现通信，需要进行链路连接
// 交换设备：交换机、路由器；通过交换中心将数据集中和传送

// ***
// 电路交换（呼叫/建立电路）（独占资源，适合实时性高的大量数据传输）
// 报文交换（存储转发、不独占资源、动态规划、多目的地）
// 分组交换（分割报文）

// 电路交换
// 1.建立连接（呼叫/电路建立）
// 2.通信
// 3.释放连接（双方确认）
// 独占资源，适合实时性高的大量数据传输
// 优点：
// 传输时延小
// 无失序问题
// 实时性强
// 全双工，无冲突
// 适用于模拟信号、数字信号
// 控制简单
// 缺点：
// 建立连接时间长
// 线路独占（信道利用率低）
// 灵活性差（出错时需要重新拨号）
// *** 无存储能力
// 无法速率匹配

// 报文交换
// 报文是网络中交换与传输的数据单元，一次性要发送的数据块
// *** 存储转发
// 优点：
// 无建立连接时延
// 动态分配路线
// 提高线路可靠性
// 提高线路利用率
// 不独占链路
// 一个报文可以发往多个地址
// 速率匹配
// 缺点：
// 实时性差，转发时延长
// 只适用于数字信号
// 要求较大的缓冲区

// 分组交换（普遍）
// 限制传输数据的单位（128B），将报文分割后分组发送
// 分组编号发送，接收后按序重组

// 交换方式的选择
// 电路交换：适合数据量大
// 报文交换：适合小数据
// 分组交换：突发性强

// 分组交换的数据报方式
// 1.网络层：无连接服务（不用先建立连接；不同分组传输路径不同）
// 2.分组是乱序的（通过编号排序）
// 3.分组需要携带目标地址和原地址和分组号
// 4.交换结点存储转发时有一定的排队时延
// 5.适用于突发性通信；不适合长报文、会话

// 分组交换的虚电路方式
// 1.网络层：连接服务（先建立连接（逻辑连接））
// 2.分组是有序的
// 3.分组不用路由选择
// 4.网络故障后需要重新建立连接

// ***** 传输介质 *****
// 传输媒体不是物理层：0层；传输媒体只能传输信号，但是并不能识别数据的意思。

// 导向性传输介质：光纤、铜线
// 非导向性传输介质：空气、海水

// 导向性：
// 双绞线：2根铜线并排绞合（绞合可以减少电磁波干扰）；屏蔽双绞线；
// 价格便宜

// 同轴电缆：抗干扰性比双绞线好，价格稍贵

// 光纤：带宽非常大，超低损耗，超远传送
// 由纤芯（实心的）和包层组成
// 多模光纤：多入射光线折射，近距离
// 单模光纤：单光纤直射，远距离

// 非导向性：
// 无线电波：信号向所有方向传输；穿透能力强，传播距离远；（手机通信）

// 微波：信号方向固定；频率高，数据率高；（地面微波接力通信；卫星通信：距离远，覆盖广，易受天气影响）

// 红外线、激光：信号方向固定

// ***** 物理层设备 *****
// 中继器
// 诞生原因：信号损耗到一定程度时会导致失真
// 功能：再生数字信号（傻）
// 5-4-3规则：5个网段，4个中继器，3个工作站

// 集线器（多口中继器）
// 再生，放大信号
// 功能：放大转发；广播转发；不能分割冲突域、平分带宽


// ***** 数据链路层（重点） *****

// 导图

// 术语
// 结点：主机、路由器
// 链路：结点间的物理通道（光纤、双绞线、微波）
// 数据链路：结点间的逻辑通道
// 帧：链路层的数据单元，封装网络层数据报

// 数据链路层：负责相邻结点间传送数据报
// 给网络层提供无差错服务（BOSS、秘书、傻子）
// 1.为网络层提供服务：无确认无连接服务、有确认无连接服务、有确认面向连接的服务
// 2.链路管理
// 3.组帧
// 4.流量控制
// 5.差错控制

// ***** 组帧 *****
// 封装成帧：在数据报的头尾添加字节（帧定界符）
// 帧同步：接收方通过帧定界符区分出帧的开始和结束
// 帧长：数据部分+头尾帧定界符

// 透明传输：链路层中“看不见”帧的数据；如果数据=帧定界符，则需要处理

// 1.字符计数法
// N+数据
// 第一个字节，标明帧的字节数
// 缺点：鸡蛋装在一个篮子里

// 2.字符填充法
// SOH+数据+EOT
// 只适用于文本文件，在数据中的SOH、EOT、ESC前添加ESC
// 接收端遇见ESC则删除

// 3.零比特填充法（常用）
// 01111110 + 数据 + 01111110
// 1.5 “1” 1 “0”：遇见5个1，添加一个0
// 2.接收端遇见5个1，删除0

// 4.违规编码法（常用）
// 曼彻斯特编码为“高-低”，“低-高”
// “高-高”，“低-低”来定界

// ***** 差错控制 *****

// 位错：0变1和1变0
// 帧错：丢失、重复、失序

// 有线通信质量好的链路：无确认无连接
// 无线通信质量差的链路：有确认面向连接

// 奇偶校验码（不一定正确）
// n-1位数据，1位校验元
// 奇校验码：1为奇数
// 偶校验码：1为偶数
// 检错能力：50%

// ***** ✨CRC循环冗余码
// 5(数据) / 2(生成多项式) = 2 ... 1(FCS：冗余码)
// 发送：5+1=6
// 接收：6/2=3...0(余数0为正确)

/**
 要发送的数据为1101 0110 11，CRC校验，生产多项式是10011，则最终发送的数据？
 1.加0：10011的阶为4，1101 0110 11 0000
 2.模2除法（异或：异1同0）：1110（FCS）
 发送的数据：1101 0110 11 1110
 接收端：模2除法判断余数
 */

// 接收到的帧均无差错（有差错的帧被丢弃了）

// ***** ✨纠错编码 *****
// 海明距离：对应比特位不同的个数
// 0000
// 0011
// 海明距离（码距）=2
// 编码集合中，海明距离最小值为该集合的海明距离
// *** 需要检测d位错，需要d+1码距
// *** 纠错d位，需要2d+1码距

// 数据m位，冗余码r位（2^r种取值）
// *** 海明不等式：2^r >= m+r+1
/**
 要发送的数据D=1100

 1.确定校验码的位数（2^r >= m+r+1）
 m=4，r=3，海明码=7位
 
 2.确定校验码的位置
 校验码插入2^n的位置
 7654321
 110x0xx

 3.求校验码的值
 7     6      5     4     3    2     1
 111 110 101 100 011 010 001
 1     1    0      x     0      x    x
          1**         *1*   **1
 4号负责4、5、6、7:110x
 2号负责2、3、6、7:110x
 1号负责1、3、5、7:100x
 
 偶校验：x4=0,x2=0,x1=1
 完整海明码：1100001
 
 4.检错和纠错
 如果接收端数据为：1110001
 4号负责4、5、6、7:1110 ❌
 2号负责2、3、6、7:0011 ✅
 1号负责1、3、5、7:1011 ❌
 
 方法：
 x4 0 1 1 1 满足偶校验：x4=1
 x2 0 0 1 1 满足偶校验：x2=0
 x1 1 0 1 1 满足偶校验：x1=1

 x4 x2 x1
1   0   1 = 5，所以第5位出错
 */


// ***** ✨流量控制、可靠传输机制 *****
// 流量控制：发送方慢一点...
// 链路层流量控制范围：网络节点-网络节点
// 传输层流量控制范围：主机 - 主机

// 链路层流量控制手段：接收方收不下就不回复确认（猫和碗）
// 传输层流量控制手段：接收端发送窗口公告

// 滑动窗口协议
// 发送窗口发送，接收窗口返回确认，接收窗口移动，发送窗口移动
// 未收到确认时，发送窗口可以继续发送

// 停止-等待协议（低效）
// 每发送一帧就停止，直到收到确认帧再继续发送
// 发送窗口 = 1
// 接收窗口 = 1

// 后退N帧协议（GBN）
// 发送窗口 > 1
// 接收窗口 = 1

// 选择重传协议（SR）
// 发送窗口 > 1
// 接收窗口 > 1

// 可靠传输：发送端发送啥，接收端接收啥
// 流量控制：发送端你慢点...
// 滑动窗口：解决流量控制，可靠传输（发送方自动重传）

// ***** 停止-等待协议 *****

// 为什么要停止-等待协议？除了比特差错，还会有丢包问题
// 实现流量控制

// 无差错情况：发送0帧，确认0帧；发送1帧，确认1帧...
// 有差错情况：发送0帧，确认0帧；发送1帧，丢失，超时重传1帧（不回复女朋友...）
// 超时计时器：比平均RTT更长一些

// ACK丢失（确认帧丢失）
// 发送0帧，确认0帧；发送1帧，返回ACK丢失，超时重传1帧，ACK1帧

// ACK迟到

// 优点：简单
// 缺点：信道利用率太低
// U = Td / (Td+RTT+Ta)

// *** ✨信道利用率：(L/C)/T (发送时延 / 发送周期)
// L:T秒内发送L比特；C：发送方数据传输率；T：发送周期，发送第一个到接收第一个
// *** ✨信道吞吐率：信道利用率*发送速率

/**
 ✨信道传输速率为4kb/s，单向传输时延30ms，信道利用率为80%则数据帧长度为：
 信道利用率：发送时间 / 发送周期
 80% = (L/4000) / (L/4000+30*2/1000) = L / (L + 30*2*4)
 L = 960bit
 信道吞吐率：
 80%*4000=3200
 */

// ***** GBN协议 *****
// 发送窗口 >1
// 接收窗口 = 1

// 上次需要发送数据时，先检查发送窗口是否满? 数据返回上层 : 数据放入发送窗口
// *** GBN协议中，对n号帧的确认采用累积确认的方式：表明已经收到n号帧以及之前的全部帧
// *** 按序接收：接收方一直期待1号帧的到来，其他帧均丢弃，返回ACK0；发送方未收到ACK1，超时后从1号帧开始重新发送
// ✨如果采用n比特对帧编号，发送窗口：1~2^n - 1；n：帧编号的比特位

/**
 1.在GBN协议中，发送方已经发送了0~7帧，超时时，只收到了0、2、3的确认帧，则需要重新发送的帧为：
 4 5 6 7
 
 ✨2.在GBN协议中，甲的发送窗口是1000，数据帧长度是1000字节，信道宽带是100Mb/s，乙每收到一个数据帧后立即返回一个短帧（忽略传输时延）
 单向传播时延是50ms，则甲可以达到的最大平均数据传输率约为：
 发送1帧所需时间为：8000 / (100*10^6) = 8*10^-5s = 0.08ms
 发送1000帧需要80ms，发送周期为100.08ms，1000帧数据大小为8Mb
 平均速率 ≈ 8Mb / 0.1 = 80Mb/s
 */

// GBN性能分析
// 好：提高了信道利用率
// 坏：重传时效率低

// ***** 选择重传协议（SR协议） *****
// 发送窗口 > 1
// 接收窗口 > 1

// 上层调用：和GBN一样
// 收到ACK，如果帧序号在发送窗口内，则标记已发送；如果ACK为第一个帧，则发送窗口移动
// 超时事件：每个帧都有计时器，超时只重新发送一个帧

// 接收窗口内的数据：来者不拒，接收到下界帧，接收窗口移动，数据交给网络层
// ✨窗口最大：2^(n-1)；n：帧编号的比特位

/**
 1.SR协议，发送方发送了0~3帧，已经确认1号帧，0，2号帧超时则需要重传的帧数为:
 0和2
 */

// ***** 信道划分介质访问链路 *****

// 点对点链路：PPP协议，广域网

// 广播式链路：共享通信介质，局域网
// 拓扑结构：总线型，星型（逻辑总线型）

// 介质访问控制
// 使得两对结点间的通信不会发生干扰
// 静态划分信道：频分FDM、时分TDM、波分WDM、码分CDM多路复用
// 动态划分信道：
// 轮询访问介质访问控制
// *** 随机访问介质访问控制：ALOHA协议、CSMA/CD协议，CSMA/CA协议

// 信道划分介质访问控制
// 多路复用技术：通过复用器将多个信号组合在共享信道上，接收时使用分用器将信号分开（把广播信道转变为点对点的信道）

// ***** 静态划分信道 *****
// 频分多路复用FDM（并行）：每个用户占用不同的带宽（频率带宽）资源
// 时分多路复用TDM（并发）：TDM帧划分为TDM时隙，用户轮流占用
// STDM：TDM的改进，按需分配时隙
// 波分多路复用WDM：光的频分多路复用
// 码分多路复用CDM：静态分配CDMA和动态分配CSMA（CS 动起来！）

// ***** 动态划分信道：ALOHA协议 *****
// 夏威夷通信不方便
// 纯ALOHA协议思想：想发就发(吞吐量低)
// 冲突则不确认，超时随机时间重发

// 时隙ALOHA协议：把时间分为若干时间片，用户只能在时间片开始时发送(吞吐量稍高)
// 控制想发就发

// ***** 动态划分信道：CSMA协议 *****
// 先听再说

// 1-坚持CSMA：监听信道，信道空闲则发送；信道忙则一直监听；如果发生冲突，等待随机时间再监听
// 优点：空闲则发送。信道利用率高
// 缺点：2个以上站点需要发送时，冲突不可避免（信道一空闲大家一起发送则冲突）

// 非坚持CSMA：空闲则直接传输；忙则等待随机时间后再监听信道
// 优点：减少冲突的可能性
// 缺点：信道空闲时，大家都在等待

// p-坚持CSMA：空闲则以概率p发送，概率1-p等待下一个时间槽发送；
// 忙则持续监听，直到空闲以概率p发送；
// 发生冲突则等到下一个时间槽再开始监听
// 优点：既能像非坚持那样减少冲突，又能像1-坚持那样减少信道空闲时间
// 缺点：冲突时，还需要发送完全部数据

// 喜茶：
// 1-坚持：超想喝...没人排队就买，否则一直排队
// 非坚持：不着急喝...没人排队就买，否则去别的地方逛逛
// p-坚持：佛性喝...没人排队p概率买，否则一直排队后p概率买

// ***** CSMA/CD协议✨ *****
// 先听再说，边听边说
// CS：carrier sense 载波监听
// MA：multiple access 多点接入（总线型网络）
// CD：collision detection 碰撞检测（半双工网络）

// A发送，传播时延τ导致B检测为空闲，进而导致碰撞
// *** A最迟2τ才能检测到碰撞，[0~2τ]

// 重传机制：二进制指数退避算法
// 1.基本退避时间2τ
// 2.定义k=重传次数，k<=10
// 3.r=[0,1,,2^k - 1]随机选一个，2rτ后重传
// 4.16次发送失败后，说明网络拥挤，向上层报错

/**
 在以太网的二进制回退算法中，发生11次碰撞后，在[0~?]中选择一个数
 2^10-1=1023
 */

// 最小帧长：帧长/数据传输速率 >= 2τ（以太网64B）

// ***** CSMA/CA *****
// 有礼貌，先听后发，发前先确定
// CA：collision avoidance 碰撞避免
// CA应用于无线局域网；CD应用于以太网
// 隐蔽站：A和C同时向B发送导致A和C碰撞，因为C不知道A要给B发

// 解决隐蔽站（可选）
// 发送RTS：request to send
// 响应CTS：clear to send

// 预约信道：告诉其他站点，需要传输多久
// 发送一帧，ACK确认一帧，否则重发

// CD和CA区别
// 相同：先听再说
// 区别：CD以太网/CA无线局域网
// CD检测冲突，CA避免冲突

// ***** 轮询访问介质访问控制 *****
// MAC协议：multiple access control
// 多路复用（时分、频分、波分、码分）
// 适用于网络负载重的情况（否则效率低）

// 随机访问MAC协议
// 适用于网络负载轻的情况（否则冲突高）

// 轮询访问MAC协议
// 无冲突，可占用全部带宽

// 轮询协议
// 主节点轮流邀请从属结点发送数据
// 缺点：轮询开销，等待延迟，单点故障（主节点宕机）

// 令牌传递协议✨（逻辑环形，物理星形）
// 令牌：确保同一时刻只有一个结点独占信道
// 令牌环网无碰撞（令牌转圈）
// 每个结点，在一定时间内获得发送数据的权利（不是无限的）
// 缺点：令牌开销，等待延迟，单点故障
// 适合负载较重的网络

// ***** 局域网基本概念和体系结构 *****
// 局域网（Local Area Network）LAN：多台计算机互联，使用广播信道
// 范围小，数据传输率高，可靠性高
// 局域网关键：网络拓扑，传输介质，介质访问控制方法

// 网络拓扑
// 星型拓扑：建网容易，共享能力差，单点故障
// 总线型拓扑👍：可靠性高，响应快，共享能力强
// 环形拓扑：节省线路，效率低，单点故障
// 树形拓扑：单点故障

// 传输介质：同轴线，双绞线，光纤，电磁波

// 介质访问控制
// 1.CSMA/CD：先听后说，边听边说；用于总线型局域网
// 2.令牌总线：用于总线型局域网
// 3.令牌环：用于环形局域网（逻辑，物理星型）

// 局域网分类
// 1.以太网：IEEE802.3标准；逻辑拓扑总线，物理拓扑星型，CSMA/CD
// 2.无线局域网WLAM：IEEE802.11标准
// 3.令牌环网（555...）：IEEE802.5
// 4.光纤（888...）：IEEE802.8

// IEEE802标准
// IEEE在1980年2月成立

// 网络层
// （数据链路层）LLC子层：逻辑链路控制层，识别网络层协议，为网络层提供服务
// （数据链路层）MAC子层：介质访问控制层，帧的封装，帧的寻址等...
// 物理层

// ***** 以太网 *****
// Ethernet：基带总线局域网，CSMA/CD
// 1.造价低
// 2.广泛
// 3.简单
// 4.速率快

// 以太网提供无连接、不可靠服务
// 无连接：无“握手过程”
// 不可靠：发送不需要编号，接收不需要确认，差错直接丢弃

// 物理拓扑：星型（不忘初心）
// 逻辑拓扑：总线型、CSMA/CD

// 10BASE-T以太网
// 10：传输速率：10Mb/s
// base：基带信号（数字信号）
// T：双绞线（最长100m）
// 采用曼彻斯特编码（前高后低，前低后高）
// CSMA/CD控制访问机制

// 通信适配器
// 完成计算机与外界局域网通信

// MAC地址
// 硬件的物理地址（全球唯一48位二进制，6个16进制表示）

// 以太网MAC帧
// 数据部分46~1500B

// 高速以太网
// 速率>=100Mb/s

// ***** IEEE802.11无线局域网 *****
// MAC帧头：
// WDS（无限分布式系统）
// RA：接收端（基站）
// TA：发送端（基站）
// DA：目的地址（手机B）
// SA：发送地址（手机A）

// TO AP（发往基站）
// FROM AP（接收基站）

// ***** PPP协议&HDLC协议 广域网 *****
// 采用分组交换技术；将局域网互联；资源共享

// PPP协议：point-point protocol
// 只支持全双工链路
// 简单：不需要可靠传输
// 封装成帧
// 透明传输
// 多种网络层协议
// 多种类型链路
// 差错检测CRC
// 检测连接状态
// 最大传输单元
// 网络层地址协商
// 数据压缩协商

// PPP协议不需要：
// 纠错
// 流量控制
// 序号
// 不支持多点线路

// PPP三个组成部分
// 1.将IP数据报封装到串行链路
// 2.链路控制协议LCP：建立数据链路连接（身份验证）
// 3.网络控制协议NCP：为网络层协议建立和配置逻辑连接

// HDLC协议
// 全双工通信

// ✨PPP协议：面向字节；2B协议字段；无序号，无确认；不可靠
// ✨HDLC协议：面相比特；没有；    有序号，有确认；可靠

// ***** 链路层设备 *****
// 网桥（旧）：根据MAC帧的目的地址对帧转发或者过滤
// 网段：计算机使用同一个物理设备直接通信的一部分
// 1.过滤通信量，增大吞吐量
// 2.扩大了物理范围
// 3.提高了可靠性
// 透明网桥：以太网“看不见”发送的帧需要经过哪几个网桥
// 自学习过程：转发表...
// 源路由网桥：源站以广播的形式发送一个发现帧（迷宫）

// 交换机（新，多端口网桥）：
// 直通式交换机：立刻转发，延迟小，可靠性低
// 存储转发式交换机👍：帧放入高速缓存，延迟大，可靠性高，支持不同速率端口的交换

// 冲突域：同一个冲突域中，所有节点都能收到所有被发送的帧；同一时间只能一台设备发送，否则信息会碰撞
// 广播域：站点发送一个广播信号，所有能收到信号的设备组成广播域

//                           隔离冲突域  隔离广播域
// 物理层设备（中继器，集线器）【傻子】 ❌    ❌
// 链路层设备（网桥，交换机）【路人】   ✅    ❌
// 网络层设备（路由器）【大佬】        ✅    ✅


// ***** ✨网络层概述 *****
// 网络层的传输单位是数据报，分组为数据报的分割
// 1.路由选择和转发（最佳路径）
// 2.异构网络互联（靠路由器）
// 3.拥塞控制（全局负载过重）

// ***** 路由算法以及相关协议 *****
// 静态路由算法（非自适应算法）管理员手工配置路由信息
// 简单可靠，在拓扑变化不大的网络中效果很好，适用于军事网络；路由更新慢

// 动态路由算法👍（自适应算法）
// 路由更新快，适用于大型网络；算法复杂，增加网络负担
// 全局性：链路状态路由算法OSPF
// 分散性：距离向量路由算法RIP

// 自治系统AS：隐藏内部的路由选择协议
// 内部网关协议IGP：1个AS RIP、OSPF
// 外部网关协议EGP：AS之间使用的 BGP

// ***** IP数据报格式 *****
// IP数据报：首部+数据部分（TCP+UDP）
// 首部分为固定部分和可变部分
// 固定部分：
// 4位：版本（IPV4、6）
// 4位：首部长度（单位4B）0101=20B
// 8位：区分服务
// 16位：首部+数据的总长度（单位1B）
// 8位生存时间：IP分组的保质期（经过路由器时-1）
// 8位协议：数据部分的协议（TCP：6，UDP：17）
// 16位首部检验和
// 32位源地址
// 32位目的地址
// 可变部分：
// 可选字段和填充字段（把首部填充为4B的整数倍）

// ***** IP数据报分片 *****
// 最大传送单元MTU：链路层数据帧可封装上限（以太网1500字节）

// IP数据报首部：
// 16位标识：同一数据报的分片使用同一标识
// 3位标志：只有2位有意义x__
// 中间位：DF=1=禁止分片，DF=0=允许分片（Don't Fragment）
// 最低位：MF=1=后面还有分片，MF=0=后面没有分片（More Fragment）
// 13位片偏移：分片在原分组的开始位置，单位8B（分片是8B的整数倍）

// IP数据报首部单位：
// 总长度：首部+数据的总长度（单位1B）
// 首部长度：单位4B
// 片偏移：分片在原分组的开始位置，单位8B（分片是8B的整数倍）
// 1总8片的首4...

// ***** IPV4地址 *****
// IP地址[网络号：区域][主机号：接口]
// 32位二进制127.0.0.1
// LAN1网络号222.1.1.0，LAN2网络号：223.1.4.0...

// 分类IP地址
// A类：网络号1B:0...
// B类：网络号2B:10...
// C类：网络号3B:110...
// D类：多播地址:1110...

// 特殊IP地址
// 网络号      主机号     源地址     目的地址    用途
// 全0        全0       可以       不可以     本网范围
// 全0        特定      可以       不可以     本网范围
// 全1        全1       不可以      可以      广播范围
// 特定        全0       不可以     不可以    表示一个网络
// 特定        全1       不可以      可以     直接广播
// 127        非全0/1    可以       可以     本地环回测试

// 私有IP地址
// A类   10.0.0.0~10.255.255.255 1个网段
// B类   172.16.0.0~172.31.255.255   16个网段
// C类   192.168.0.0~192.168.255.255 256个网段

// 网络类型     最大可用网络数     第一个可用的网络号   最后一个可用的网络号  最大主机数
// A类         2^7 - 2          1                126               2^24-2
// B类         2^14 - 1         128.1            191.255           2^16-2
// C类         2^21 - 1         192.0.1          223.255.255       2^8-2
// A类不能用全0和全1（全1=127=环回地址）
// C类不能用全0

// ***** 网络地址转换NAT *****
// 路由器对私有IP地址的数据报一律不转发
// 路由器上安装NAT软件，变成NAT路由器，它至少有一个全球IP地址
// 使用NAT转换表实现

// ***** 子网划分、子网掩码 *****
// 分类IP地址弱点：1.IP地址利用率低（主机号太多）
// 2.两级IP地址不灵活（申请时复杂）

// 分类IP
// 网络号+主机号 二级IP地址

// 子网划分
// 网络号+子网号+主机号(最少2位) 三级IP地址
// 主机号不能全0/1

// 子网掩码（区分子网号和主机号）
// 只要是网络号和子网号全1，主机号全0（255.255.192.0）
// 子网掩码和IP地址进行与运算 = 子网网络地址
// 子网掩码不同，网络地址可以相同

/**
 IP地址141.14.72.24，子网掩码是255.255.192.0，255.255.224.0 求网络地址
 0100 1000
 1100 0000
 0100 0000
 141.14.64.0
 
 0100 1000
 1110 0000
 0100 0000
 141.14.64.0
 
 ✨IP地址为180.80.77.55，子网掩码是255.255.252.0，若主机向子网发送广播则目的地址可以是：
 0100 11   01
 1111 11    00
 0100 1100
 发送广播，主机位全是1
 0100 1111
 180.80.79.255
 */

// ***** 无分类编址CIDR *****
// 网络前缀+主机号:128.14.32.0/20
// "/"表示网络前缀的位数

// CIDR地址块：网络前缀一样的IP地址
// 10000000 00001 110 00100000 00000000
// 最小地址：10000000 00001110 0010 0000 00000000 128.14.32.0
// 最大地址：10000000 00001110 0010 1111 11111111 128.14.47.255
// 地址块：128.14.32.0/20
// 地址掩码（区分网络号和主机号）：11111111 11111111 11110000 00000000

/**
 192.199.170.82/27
 地址块包括多少IP地址
 2^5 = 32
 地址块最小地址和最大地址
 192.199.170.64~192.199.170.95
 */

// 构成超网✨
// 将多个子网构成较大的子网
// 网络地址取交集（网络号相同的部分），主机号为0
// 划分子网：少->多
// 划分超网：多->少
/**
网络1：206.1.0.0/17
网络2：206.1.128.0/17
超网：206.1.0.0/16
 
 某路由表中有转发接口相同的4条路由表，目的网络地址分别为35.230.32.0/21
 35.230.40.0/21,35.230.48.0/21,35.230.56.0/21聚合后的目的网络地址为：
 0010 0 000
 0010 1 000
 0011 0 000
 0011 1 000
 001 0 0000
 35.230.32.0/19
*/

// 最长前缀匹配✨（IP与子网掩码按位相与）
// 在CIDR中，查找路由表可能得到几个匹配结果（和子网掩码按位相与），选择最长网络前缀的路由
/**
 数据报目的地址206.0.71.130
 北京大学206.0.68.0/22
 计算机系206.0.71.128/25
 物理系206.0.71.0/25
 71：0100 0111
 130:1000 0010

 北京大学匹配成功：
 1111 1100 0000 0000
 0100 0111 1000 0010
 0100 0100 0000 0000
 206.0.68.0/22
 
 ✨计算机系匹配成功（最长）：
 1000 0000
 1000 0010
 1000 0000
 206.0.71.128/25
 
 物理系匹配失败：
 1000 0000
 1000 0010
 1000 0000
 206.0.71.128/25
 
 进入路由器R0的分组目的地址为132.19.237.5
 R1:132.0.0.0/8
 R2:132.0.0.0/11
 R3:132.19.232.0/22
 R4:0.0.0.0/0
 237:1110 1101
 19:0001 0011
 5:0000 0101
 
 R3匹配失败：
 1111 1100 0000 0000
 1110 1101 0000 0101
 1110 1100 0000 0000
 132.19.236.0/22
 R2匹配成功✨：
 1110 0000
 0001 0011
 0000 0000
 132.0.0.0/11
 */

// ***** ARP协议 *****

// 物理层和链路层使用MAC地址
// 网络层使用IP地址

// 发送数据的过程
// 应用层: PDF
// 传输层：报文段分段1，2，3
// 网络层：1+IP1（源地址）+IP3（目的地址）<-- 分组
// 链路层: FCS+1+IP1+IP3+MAC1+MAC3?全1 --> ✨ARP高速缓存：IP地址与MAC地址的映射(10~20min)
// 广播ARP请求分组，单播ARP响应分组：1+IP1+IP3+MAC1+FF-FF-FF-FF，IP3+MAC3
// 物理层：码元+码元...

// ✨4种情况
// 1.A发送给本网络的B：ARP找到B的MAC地址
// 2.A发送给另一网络的B：ARP找到路由器MAC地址
// 3.路由器发送给本网络A：ARP找到A的MAC地址
// 4.路由器发送给另一网络B：ARP找到本网络上另一路由器的MAC地址

/**
 主机A给B发送数据报，经过了5个路由器需要几次ARP协议？
 A1 O2 O3 O4 O5 O6 B
 6次
 */

// ***** DHCP协议 *****
// 主机如何获得IP地址？
// 1.静态配置（机房由管理员静态配置）IP地址，子网掩码，默认网关
// 2.动态配置（教学楼里的移动设备）DHCP主机分配IP地址

// ✨DHCP：应用层协议，客户/服务器方式，通过广播交互，基于UDP
// 1.主机广播DHCP发现报文
// 2.DHCP服务器广播DHCP提供报文
// 3.主机广播DHCP请求报文
// 4.服务器广播DHCP确认报文

// ***** ICMP协议 *****
// ICMP：发送差错报文
// 1.终点不可达（无法交付）
// 2.源点抑制（拥塞）
// 3.时间超过（TTL=0）
// 4.参数问题（首部出问题）
// 5.改变路由（重定向）

// ✨不发生ICMP报文的情况
// 1.ICMP报文
// 2.后续数据报片
// 3.组播地址
// 4.特殊地址（127.0.0.0，0.0.0.0）

// 应用：PING（ICMP回送请求和回答报文）、Traceroute（ICMP时间超过）

// ***** IPV6 *****

// IPV4地址消耗殆尽：CIDR，NAT，IPV6（根本解决）

// IPV6数据报格式
// 基本首部40B+有效载荷+数据
// 源地址，目的地址：128位

// IPV4和IPV6区别
// ✨1.地址从32位扩展到128位
// 2.校验字段彻底移除，减少处理时间
// ✨3.可选字段移出首部，变为了扩展首部
// ✨4.即插即用
// ✨5.IPV6首部长度为8B整数倍，IPV4：1总8片的首4
// ✨6.IPV6只能在主机分片，IPV4可以再路由器和主机分片
// 7.ICMPv6：分组过大
// 8.IPV6取消了协议字段
// 9.IPV6取消了总长度字段，改用有效载荷字段

// IPV6地址表示形式
// 冒号十六进制：4BF5:AA12:CB35:CB35:4BF5:AA12:CB35:CB35
// 压缩形式：4BF5:0000:0000:0000:000A:039A:CB35:CB35
// 压缩：4BF5:0:0:0:A:39A:CB35:CB35
// 零压缩（只能出现一次）：FF05:0:0:0:0:0:0:B3 --> FF05::B3

// 单播：一对一通信 源地址+目的地址
// 多播：一对多 目的地址
// 任播：一对多中的一个通信 目的地址

// IPV6向IPV4过渡
// 双栈协议：路由器能和IPV4、IPV6通信，主机同时拥有IPV4、IPV6地址
// 隧道技术：IPV4中的数据部分为IPV6

// ***** RIP协议（路由选择协议） *****
// 基于距离向量的路由选择协议，优点是简单
// 维护路由表，从路由器到目的网络最佳距离记录
// 目的网络     距离      下一跳路由器
// Net2        1        直接交付
// Net1        2        R2
// 距离表示经过的路由器个数，距离最大为15，所以适合小型网络
// RIP特点（和谁交换？交换什么？多久交换一次？）
// 1.只和相邻路由器交换
// 2.交换自己的路由表
// 3.30秒交换一次，超180秒没收到则确定邻居没了。。
// 4.经过若干次更新后，最短距离“收敛”,好消息传得快，坏消息传的慢

// ✨距离向量算法
// 1.修改相邻路由器发来的RIP报文中的所有表项
// 下一跳改为x，距离+1
// 2.如果没有目的网络，增加
// 如果已经有目的网络，查看下一跳地址
//  如果下一跳是x，则替换
//  如果下一跳不是x，则选择最短的距离
// 3.180s没收到相邻路由器RIP报文，把X记为不可达，距离设为16

/**
 1.尝试更新R6路由表
 R6
 目的网络     距离      下一跳路由器
 Net2            3            R4
 Net3            4            R5
 
 收到R4
 目的网络     距离      下一跳路由器
 Net1            3            R1
 Net2            4            R2
 Net3            1            直接交付
 
 修改路由表R4
 目的网络     距离      下一跳路由器
 Net1            4            R4
 Net2            5            R4
 Net3            2            R4
 
 更新R6：
 目的网络     距离      下一跳路由器
 Net1            4            R4
 Net2            5            R4
 Net3            2            R4
 
 2.如图所示子网，下面的向量到达C：B(5,0,8,12,6,2),D(16,12,6,0,9,10),E(7,6,3,9,0,4)
 C到B、D、E的延迟分别为6，3，5求C的最短路径向量
   / B       C  \
 A        \ /             D
   \ E       F  /
 C到B:(11,6,14,18,12,8)
 C到D:(19,15,9,3,12,13)
 C到E:(12,11,8,14,5,9)
 C最短(11,6,0,3,5,8)
 */

// ***** OSPF协议（路由选择） *****
// Dijkstra提出的最短路径算法SPF
// OSPF特点（适合大规模网络）
// 1.洪泛法向自治系统内所有路由器发送信息（广播）
// 2.发送相邻所有路由器的链路状态
// 3.只有链路状态发生变化时才发送，每个路由器都能建立全网拓扑图

// 链路状态路由算法
// 1.向邻居发送HELLO问候分组
// 2.设置成本度量metric
// 3.构造DD数据库描述分组，发给邻居
// 4.如果邻居有了则不处理，如果出现更新和新增则发送LSR
// 5.收到LSR，发送LSU
// 6.返回lsACK

// ”收敛“速度很快

// ***** BGP协议（外部网关路由选择） *****
// 和谁交换？与其他AS的邻站BGP发言人交换信息
// 交换什么？网络可达性：到达某个网络需要经过的一系列AS
// 多久交换？发生变化时才交换

// RIP协议是基于距离向量的内部网关路由选择协议，通过广播UDP（不可靠）来交换
// OSPF是内部网关路由协议，因为交换的信息大所以直接采用IP
// BGP是外部网关协议采用TCP（可靠）
// 助记符：RU、OI、BT

// ***** IP组播 *****
// IP数据报传输方式
// 单播：点对点
// 广播：一对多
// 组播👍：一对多

// 广播和组播区别
// 广播会给全部主机发送数据报
// 组播只给“感兴趣”的主机发送数据报

// IP组播地址（只能作为目的地址）
// 同一组的主机，拥有相同的IP组播地址
// D类地址224.0.0.0~239.255.255.255，源地址为单播地址
// 1.UDP（不可靠）
// 2.不产生ICMP
// 3.并非所有D类地址都能作为组播地址

// 硬件组播（局域网内）
// MAC地址01-00-5E开头
// IGMP协议：组播路由选择协议

// ***** 移动IP *****
// 应用：QQ异地登录、漫游电话费

// 移动IP：设备移动，IP不动
// 移动结点：具有固定IP地址的设备
// 归属代理（本地代理）：管家，管理归属网络
// 永久地址（主地址）：在归属网络中的原始地址
// 外部代理（外地代理）：移动到异地的管家
// 转交地址（外部地址）

// ***** 网络层设备 *****
// 路由器：具有多个输入和输出端口的计算机，用于转发分组
// 1.路由选择部分
// 2.分组转发部分

//                           隔离冲突域  隔离广播域
// 物理层设备（中继器，集线器）【傻子】 ❌    ❌
// 链路层设备（网桥，交换机）【路人】   ✅    ❌
// 网络层设备（路由器）【大佬】        ✅    ✅


// ***** 传输层 *****
// 只有主机才有的层次
// 传输层功能
// 1.提供进程和进程间的逻辑通信
// 2.复用和分用（寄信和收信）
// 3.差错检测

// 传输层有两个好兄弟
// 大哥TCP和二弟UDP
// 大哥靠谱，二哥不靠谱

// TCP：面向连接，提供可靠服务，时延大，适用于大文件
// UDP：无连接，提供不可靠服务，时延小，适用于小文件

// 逻辑端口/软件端口：是传输层的SPA，标识主机的进程
// 长度16bit，可表示65536个端口
// 熟知端口号：非常重要的程序0~1023
// 登记端口号：不那么重要的程序1024~49151
// 客户端使用的端口号：客户进程运行时才动态分配49152~65535

// FTP      TELNET      SMTP        DNS     HTTP
// 21       23          25          53      80

// 套接字Socket=主机IP+软件端口号

// ***** UDP协议 *****
// 特点
// 1.无连接
// 2.最大努力交付，即不可靠交付
// 3.面向报文，适合一次性传输少量数据
// 4.没有拥塞控制，适合实时应用
// 5.首部8B

// UDP首部格式
// 源端口号：2B
// 目的端口号：2B
// UDP长度：2B
// UDP检验和：2B

// 伪首部12B：计算检验和时才使用
// 源IP地址：4B
// 目的IP地址：4B
// 0：1B（固定）
// 17：1B（代表协议）
// UDP长度：2B（首部+数据）

// ***** ✨TCP协议 *****
// 1.TCP是面向连接（虚连接）的协议，提供可靠传输（打call）
// 2.每条TCP只能有2个端点（点对点）
// 3.可靠有序，不丢不重
// 4.全双工通信：
// 发送缓存：准备发送的数据；已发送但未确认的数据
// 接收缓存：按序到达但是应用程序未读取；不按序到达的数据
// 5.TCP面向字节流

// ✨✨✨TCP报文段的首部格式
// 源端口：16位
// 目的端口：16位
// 序号seq：32位：发送端第一个字节的序号
// 确认号ack：32位：如果确认号为N，代表接收端序号为N-1之前的数据全部收到
// 数据偏移：4位：首部长度，单位4B
// 保留位：6位
// URG：1位紧急位：高优先级发送
// ACK：1位确认位：连接建立后设为1
// PSH：1位推送位：高优先级接收
// RST：1位复位：表示TCP连接出错，需要重新连接
// SYN：1位同步位：表示这是一个连接请求
// FIN：1位终止位：表面发送完毕，释放连接
// 窗口：16位：接收窗口大小
// 校验和：8位：需要加上12B伪首部，第四个字段为6（UDP为17）
// 紧急指针：8位：URG为1时才有用。指出紧急数据的长度
// 选项：可变
// 填充：填充为4B整数倍

// ***** TCP连接管理 *****
// TCP是全双工通信
// 1.连接建立
// 2.数据传输
// 3.连接释放

// TCP建立连接采用客户服务器方式

// 3次握手
// 1.有句话不知当讲不当讲
// 2.你说吧
// 3.好的，#@%&……%￥#

// 1.客户端发送请求报文段：SYN=1，seq=x（随机）
// 2.服务器返回确认报文段，分配缓存：SYN=1，ACK=1，seq=y，ack=x+1
// 3.返回确认（可以携带数据），分配缓存：SYN=0，ACK=1，seq=x+1，ack=y+1

// SYN洪泛攻击
// 黑客不进行第三次握手

// 4次握手
// 4.客户端发送连接释放报文段：FIN=1，seq=u
// 5.服务器回复确认释放报文段（客户端不能发送了，服务器还能发送，半关闭）：ACK=1，seq=v，ack=u+1
// 6.服务器发送关闭连接报文段：FIN=1，ACK=1，seq=w，ack=u+1
// 7.客户端回复确认报文段，等待2MSL后关闭连接：ACK=1，seq=u，ack=w+1

// ***** TCP可靠传输 *****
// 网络层：尽最大努力传输，不可靠传输
// 传输层：使用TCP实现可靠传输
// 可靠：可靠有序，不丢不重

// 1.校验：类似UDP
// 2.序号：发送方的序号字段
// 3.确认：接收方返回下一个想要接受的字段
// 4.重传：超时后，发送方未收到确认，就会重新发送
// RTTs：动态改变重传时间

// 冗余ACK
// 发送1，2，3，4，5
// 接收方收到1，返回确认（确认号为2）
// 接收方收到3，返回确认（确认号为2）
// 接收方收到4，返回确认（确认号为2）
// 接收方收到5，返回确认（确认号为2）
// 发送端收到3个冗余ACK，认为2号已经丢失（快速重传）

// ***** ✨TCP流量控制 *****
// 流量控制：发送方你慢点...
// TCP使用滑动窗口机制实现流量控制
// rwnd：发送窗口大小

// 无限等待的产生和防止
// 返回的rwnd=0时为零窗口通知，发送端停止发送；启动计时器
// *返回rwnd=100时，发送端又开始发送；
// 如果*丢失，发送端在计时器结束时，发送零窗口探测报文段，接收方又会将当前rwnd发送回来。

// ***** ✨TCP拥塞控制 *****
// 拥塞：网络堵塞
// 产生条件：
// 资源需求的总和 > 可用资源：网络吞吐量大幅下降
// 拥塞控制：
// 防止过多的数据注入到网络中。（全局性）

// 拥塞控制和流量控制的区别
// 拥塞控制：多台主机造成的
// 流量控制：点对点

// 假定：
// 1.数据单方向传送，另一方确认
// 2.接收方有足够大的缓存，发送窗口只取决于拥塞程度
// 接收窗口rwnd：反应接收方的缓存容量
// 拥塞窗口cwnd：反应当前网络容量

// 慢开始&拥塞避免
// 1.慢开始：cwnd=1先指数规律增长，到达ssthresh=16的初始值时，加法增长（拥塞避免）
// 2.出现拥塞时，设置新的ssthresh=12，瞬间cwnd=1，重复1
// tips：一收到确认后，cwnd就增加

// 快重传&快恢复
// 快重传：收到3个冗余ack后就重传
// 快恢复：快重传后，cwnd=20下降到cwnd=10，这就是快恢复


// ***** 应用层 *****
// 文件传输、访问和管理
// 电子邮件
// 虚拟终端
// 查询服务和远程作业登录

// FTP
// SMTP、POP3
// HTTP
// DNS

// 网络应用模型
// C/S模型
// 服务器：提供计算服务的设备
// 1.永久提供服务
// 2.永久性的访问地址/域名
// 客户机：请求计算服务的主机
// 1.与服务器通信
// 2.间歇性接入网络
// 3.可以使用动态IP地址
// 4.不与其他客户机直接通信

// P2P模型
// 每个主机即可以提供服务，也可以请求服务
// 任意结点间可以直接通讯
// 结点可以间接性介入网络
// 结点可能改变IP地址
// 可扩展性好
// 网络健壮性强

// ***** 域名解析系统DNS *****
// www.baidu.com：三级域名 二级域名 顶级域名
// 从左到右，由低到高，com为顶级域名

// 根域名服务器：解析顶级域名
// 顶级域名服务器：解析二级域名
// 权限域名服务器：负责一个区
// 本地域名服务器：主机发出DNS请求时，优先发送给本地域名服务器

// 递归查询（靠别人）
// 本地--根--顶级--权限

// 迭代查询（靠自己）
// 本地--根 本地--顶级 本地--权限

// ***** FTP *****
// 端口号21
// FTP使用TCP实现可靠传输

// 控制进程&TCP控制连接：21：始终保持
// 数据传送进程&TCP数据连接：20：连接一会
// 数据传送端口号与模式有关
// 主动模式：端口号为20
// 被动模式：>1024，客户端发出询问，服务器回答

// ***** ✨电子邮件 *****
// 信息格式
// 信封：收件人
// 内容：
//  首部：To：xxx@qq.com
//       Subject:Halo
//  主体：*&……%￥#...

// 电子邮件系统-组成结构
// 用户代理、邮件服务器、协议（SMTP、POP3）

// 用户代理：电子邮件客户端
// 邮件服务器：
// 1.发送&接收邮件
// 2.向发件人报告发送结果
// 协议：
// SMTP发邮件
// POP3、IMAP收邮件

// ✨SMTP
// SMTP进程：SMTP客户 -- SMTP服务器
// TCP连接，端口号25，C/S

// 三个阶段：连接建立：邮件发送：连接释放
// 邮件发送：
// A: mail from <364216899@qq.com>
// B: "250 OK" / B: 451... Ready to receive
// A: RCPT TO <13261675306@163.com>
// B: "250 OK" / B: No such user here
// A: DATA Ready to send data
// B：OK
// A：data...
// B: "250 OK"

// SMTP局限
// 1.无法传输二进制和可执行文件
// 2.只能传输7位ASCII码
// 3.超过一定的长度无法传输

// MIME扩展
// MIME协议：使得SMTP支持视频，声音，语言，使得内容丰富多彩

// 邮局协议POP3
// TCP连接，端口110，C/S
// 从接收端邮件服务器中读取文件
// 下载并保存；下载并删除

// IMAP协议
// 可以先看邮件首部，需要时才下载
// 可以先看内容，有wifi时才下载视频

// 基于万维网的电子邮件
// 方便
// 用户和代理间使用HTTP协议
// 邮件服务器间使用SMTP协议

// ***** 万维网和HTTP *****
// 统一资源定位符：URL<协议>://<主机>:<端口>/<路径>
// 通过超文本传输协议HTTP传输
// 通过HTML展示

// HTTP协议
// 1.建立TCP
// 2.HTTP请求报文
// 3.HTTP响应报文
// 4.释放TCP

// 具体过程
// 1.浏览器解析URL
// 2.请求DNS解析URL
// 3.获取IP地址
// 4.建立TCP连接
// 5.HTTP请求报文
// 6.HTTP响应报文
// 7.释放TCP连接
// 8.浏览器显示内容

// 特点
// 1.HTTP协议是无状态的
// Cookie存在用户主机中，用来识别用户
// 2.HTTP本身是无连接的，传输层使用TCP

// HTTP连接方式
// 1.非持久连接
// TCP第3次握手时，带上HTTP请求
// 请求时间：2*RTT+传输文档时间

// 2.持久连接
// 保持连接，只需要一次“3次握手”，后续可直接发送HTTP请求和HTTP响应（）
// 流水线式持久连接（GBN，SR）
// 非流水线式持久连接（停-等协议）

// HTTP报文结构
// 开始行（区分请求和响应）
// 首部行（说明浏览器、服务器、报文主体的信息）
// 实体主体

// 状态码
// 1xx 通知
// 2xx 成功202
// 3xx 重定向301
// 4xx 客户错误404
// 5xx 服务器错误505

#endif /* network_hpp */
